#include <termios.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdint.h>
#include "serial.h"
#define BAUDRATE B115200
#define ERROR -1
#define OK 0
#define TXBUFSIZE 64
uint16_t tx_frame[TXBUFSIZE];

int configure_serial(int fd)
{
    struct termios tty;

    if (tcgetattr(fd, &tty) != 0)
    {
        perror("tcgetattr");
        return -1;
    }

    cfsetospeed(&tty, BAUDRATE);
    cfsetispeed(&tty, BAUDRATE);

    tty.c_cflag &= ~PARENB;
    tty.c_cflag &= ~CSTOPB;
    tty.c_cflag &= ~CSIZE;
    tty.c_cflag |= CS8; // 8 位数据位
    tty.c_cflag |= (CLOCAL | CREAD);

    tty.c_iflag &= ~(IXON | IXOFF | IXANY);
    tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL);

    tty.c_oflag &= ~OPOST;
    tty.c_oflag &= ~ONLCR;

    tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

    tty.c_cc[VMIN] = 0;  // 非阻塞读
    tty.c_cc[VTIME] = 0; // 无超时

    tcflush(fd, TCIOFLUSH);

    if (tcsetattr(fd, TCSANOW, &tty) != 0)
    {
        perror("tcsetattr");
        return -1;
    }

    return 0;
}

int serial_init(const char *serialport)
{
    // 2. 打开串口
    int serial_fd = open(serialport, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (serial_fd < 0)
    {
        fprintf(stderr, "Error opening %s: %s\n", serialport, strerror(errno));
        return -1;
    }
    printf("Opened serial port: %s\n", serialport);

    // 3. 配置串口
    if (configure_serial(serial_fd) != 0)
    {
        fprintf(stderr, "Failed to configure serial port.\n");
        close(serial_fd);
        return -1;
    }
    return serial_fd;
}
